#include <stdio.h>
#include <stdlib.h>
#include "queue.h"

/*
 * Init - 队列初始化函数
 * @queue 指向队列结构体Queue的指针
 * 返回值：return 1:创建失败  return 0:创建成功
 * 给该队列分配一段内存，并将头尾指针置为0
 */
int InitQueue(Queue *queue)
{
     queue->base = malloc(sizeof(datatype_q) * MAXSIZE_Q);
     if (queue->base == NULL)
          return -1;
     queue->front = queue->rear = 0;
     return 0;
}

/*
 * EnQueue - 入队函数
 * @queue 指向队列结构体Queue的指针
 * @data 需要入队的数据
 * 返回值：return 1:队列已满，入队失败  return 0:入队成功
 * 入队成功，队尾指针加1
 */
int EnQueue(Queue *queue, datatype_q data)
{
     if (queue->rear >= MAXSIZE_Q)
          return -1;
     queue->base[queue->rear++] = data;
     return 0;
}

/*
 * DeQueue - 出队函数
 * @queue 指向队列结构体Queue的指针
 * 出队成功，队头指针+1
 */
void DeQueue(Queue *queue)
{
     if (queue->front == queue->rear)
          return;
     ++queue->front;
}

/*
 * QueueIsEmpty - 判断队列是否为空函数
 * @queue 指向队列结构体Queue的指针
 * 返回值：return 1：队列为空;return 0：队列非空
 */
int QueueIsEmpty(Queue *queue)
{
     if (queue->front == queue->rear)
          return 1;
     return 0;
}

/*
 * Show - 打印函数
 * @queue 指向队列结构体Queue的指针
 * 打印队列从头到尾的值
 */
void Show(Queue *queue)
{
     printf("队头< ");
     for (int i = queue->front; i < queue->rear; i++)
          printf("%c  ", queue->base[i]->data);
     printf(">队尾");
     printf("\n");
}

/*
 * Length - 获取队列长度
 * @queue 指向队列结构体Queue的指针
 */
int Length(Queue *queue)
{
     return queue->rear - queue->front;
}

/*
 * GetHead - 获取队列头结点
 * @queue 指向队列结构体Queue的指针
 * @value 指向存放队列头结点的值的变量的指针
 */
void GetHead(Queue *queue, datatype_q *value)
{
     if (queue->front == queue->rear)
          return;
     *value = queue->base[queue->front];
}

/*
 * Destory - 销毁队列
 * @queue 指向队列结构体Queue的指针
 */
void Destory(Queue *queue)
{
     free(queue->base);
     queue->base = NULL;
}